const utils = {
    //getcookie 取
    //@param key<string> 获取cookie的名称
    getCookie(key) {
        //取出所有的cookie，构造成一个对象
        let str = document.cookie;
        let cookies = str.split('; ');
        let obj = new Object();
        cookies.forEach(item => {
            let arr = item.split('=');
            obj[arr[0]] = decodeURIComponent(arr[1])
        })
        return obj[key] //从对象里找到key的值
    },
    //options表示可取或者不取
    setCookie(key, value, options) { //存cookie
        let str = `${key} = ${encodeURIComponent(value)}` //拼接字符串
        if (options) { //判断有没有options值
            if (options.expires) {
                let date = new Date(); //设置当前时间
                date.setDate(date.getDate() + options.expires) //设置时间
                str += `;expires=${date.toUTCString()}` //拼接字符串 加上天时间
            }
            if (options.path) { //判断有没有path
                str += `;path=${options.path}` //true  拼接字符串 加上path
            }
        }
        document.cookie = str;
    },
    //ajax get请求
    /**
     * 
     * @param {string} url 路径
     * @param {object} query 请求需要携带得参数
     * @param {function} fn 请求成功之后返回得回调函数
     * @param {boolean}[isJson] 请求数据是否为json 默认为true
     */
    get(url, query, fn, isJson = true) {
        if (query) { //先判断有没有query
            url += `?` //为true得时候拼接
            for (let key in query) { //通过循环把参数拼进去
                url += `${key}=${query[key]}&` //参数多的话需要加上& and
            }
            url += url.slice(0, -1) //因为最后有& 需要截取
        }
        let xhr = new XMLHttpRequest(); //创建对象
        xhr.open('get', url); //open方法
        xhr.send(); //传输
        xhr.onreadystatechange = function() { //onreadystatechange函数
            if (xhr.readyState === 4) { //判断状态
                if (xhr.status === 200) { //判断状态
                    //三元运算符 有json转 没用json不转
                    let res = isJson ? JSON.parse(xhr.responseText) : xhr.responseText;
                    fn && fn(res) //满足条件执行后面，一个不满足执行前面
                }
            }
        }
    },
    /* ajax post请求
     * @param {string} url 路径
     * @param {object} query 请求需要携带得参数
     * @param {function} fn 请求成功之后返回得回调函数
     * @param {boolean}[isJson] 请求数据是否为json 默认为true
     */
    post(url, query, fn, isJson = true) {
        let str = '';
        if (query) {
            for (let key in query) {
                str += `${key}=${query[key]}&` //参数多的话需要加上& and
            }
            str = str.slice(0, -1); //减去最后得&符号
        }
        let xhr = new XMLHttpRequest();
        xhr.open('post', url, );
        //把发送得数据格式设置为urlencoded
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        xhr.send(str) //str地址
        xhr.onreadystatechange = function() { //onreadystatechange函数
            if (xhr.readyState === 4) { //判断状态
                if (xhr.status === 200) { //判断状态
                    let res = isJson ? JSON.parse(xhr.responseText) : xhr.responseText;
                    fn && fn(res)
                }
            }
        }
    },
    /**
     * 
     * @param {string} url  //请求得地址 
     * @param {string} cb //回调函数得名字 这个函数必须是全局得
     * @param {object} query //其他的参数
     */
    jsonp(url, cb, query) {
        url += `?cb=${cb}`
        if (query) {
            for (let key in query) {
                url += `&${key}=${query[key]}`
            }
        }
        let script = document.createElement('script')
        script.src = url
        document.body.appendChild(script)
        document.body.removeChild(script)
    },
    /**
     * 
     * @param {string} url   //请求路径 
     * @param {boject} query //请求需要携带的参数
     * @param {boolean} isJson //请求数据是否为json 默认为true
     */
    fetch(url, query, isJson = true) {
        if (query) {
            url += `?`
            for (let key in query) {
                url += `${key}=${query[key]}&`
            }
            url = url.slice(0, -1);
        }
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('get', url);
            xhr.send();
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(isJson ? JSON.parse(xhr.responseText) : xhr.responseText)
                    } else {
                        reject()
                    }
                }
            }
        })
    }
}